Pythonの歩き方 (Beginner’s guidebook on Python3) ================================================ 旅の準備 -------- これからPythonを学ぶ旅に出る前に、 Pythonの概要を掴んでおきましょう。 初めて聴く言葉もあるかと思いますが、それらの詳しい意味は徐々に説明していきます。 .. figure:: _images/PythonWorld.png :alt: Python Map Image Python Map Image pythonとは ~~~~~~~~~~ まずは目的地であるPythonの概要を説明します。 Pythonはプログラミング言語の\ **規格**\ であり、またそのインタプリター形の\*\ **実行系**\ の名前でもあります。 (この実行系は\ ``CPython``\ と呼ばれることもあります。) 2021年現在において、Pythonはさまざまな局面で使われています。 何よりも、Pythonはあなたが電子計算機を使う上でとても有用なツールになるでしょう。 ここでは、PythonをあなたのPCで使い始めるに当たって、ちょっと知っておくと役に立つであろう 事を紹介しておきます。ここで紹介した事を全てマスタする\ **必要はありません**\ が、Pythonプログラム開発を始めた時、思い出していただければ役にたつこともあるのではないかと期待しています。 BDFL : Benevolent Dictator For Life 慈悲深き終身の独裁官, Pythonの著者 Guido van Rossumのこと。彼はオランダ出身。 Pythonの歴史 ~~~~~~~~~~~~ .. figure:: https://www.python.org/static/community_logos/python-logo.png :alt: Python_Logo_Image Python_Logo_Image -------------- 1. PythonはGuido van Rossum(BDFL)氏がクリスマス休暇のプロジェクトとして作り出した。 2. Pythonロゴの蛇は O’Reillyの表紙から。 3. Pythonの名前はTV番組のタイトルから -------------- Mark Lutz氏の「Programming Python」(第一版)の序文によると、 ``Python`` はGuido van Rossum氏が1989年のクリスマス休暇中の「趣味」のプログラミングプロジェクトとして 始めたプログラミング言語です。 van Rossum氏は大ファンであった「Monty Python’s Flying Circus」に因んで、この言語を「深く意味も考えずに」 ``Python``\ と名付けたとのことです。 つまり、\ ``Python``\ の始まりは蛇のPythonとは(直接には)関係が無かったということです。 Python Logo ^^^^^^^^^^^ このことから、Pythonのアイコンとして当初は、 |Image| なども使われていました。 しかし、 Mark Lutz氏の「Programming Python」が蛇本と呼ばれることがあるように、大蛇(Python)がその表紙に描かれていたことから(?)、Pythonのアイコンは蛇のアイコンへと変化していきました。 |Image| 現在のPythonの公式ロゴは |Image| です。 改めて考えると、このロゴはPython2の時代に定められました。Python3が主流になった今日、ロゴも三匹の蛇(Python)に変わるのかもしれません。 蛇足ですが、迷惑メールをspamメールと呼ぶのは、「Monty Python’s Flying Circus」 の一つのエピソードに ちなんでいるということは良く知られています。 .. |Image| image:: _images/16ton.gif .. |Image| image:: _images/old-python-log.png .. |Image| image:: https://www.python.org/static/community_logos/python-logo.png PEP (Python Enhancement Proposal) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Python本体の開発は、PEP(Python Enhancement Proposal)を提出して 新しい機能を提案することから始まります。試験実装と議論を通じてPEPは改定されて ゆき、合意が得られたところで、公式な言語仕様として採用されます。 インターネットの仕様におけるRFC(Request For Comments)に似た仕組みです。 これまでに提案されたPEPは、\ `PEP インデッックス `__ で知ることができます。 Pythonの地図 ~~~~~~~~~~~~ モジュール(Pythonのライブラリ) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. figure:: _images/PythonWorld.png :alt: Python Map Image Python Map Image Pythonの特徴のひとつは豊富なライブラリ(モジュール)です。 Python自体は汎用のプログラム言語ですので、電子計算機で実現できることは、Python言語を使ってできるといってもいいのですが、豊富に用意されたライブラリ/アプリケーションを利用することで、目的を手早く、簡単に実現できるでしょう。 Pythonの配布パッケージには *Python 標準ライブラリ* (`Python ドキュメント ページ `__ を参照) が含まれています。 Python 標準ライブラリには、 1. Pythonがもつ基本的なデータ型を効率よく利用するためのライブラリ(\ ``string``,\ ``re`` ,\ ``datetime``,…)、 2. 数学関数(``math``, ``statistics``)、 3. OSのもつ様々な機能(\ ``os``)、 4. GUI作成用ライブラリ(``tkinter``) などが用意されています。 標準ライブラリ以外にもサードパーティから豊富なライブラリが提供されています。これらの拡張ライブラリは `PyPI `__ あるいは `GitHub `__ などで公開されています。 PyPI(Python Package Index) はpythonライブラリを配布する de facto スタンダードとなっており、\ ``pip`` コマンド あるいは ``pip`` モジュールを使うことで、簡単にモジュールを入手し、インストールすることができます。 よく使われるサードパーティモジュールには、\ ``matplotlib``, ``scipy``, ``numpy``,\ ``pandas``\ などがあります。 J-PARCの制御システムでは、\ ``ca``,\ ``ROOT``, ``cVXI``\ などのモジュールが使われています。 (``matplotlib`` をベースにした ``seaborn`` など世の中には様々なモジュールが存在しています。全てをカバーすることは難しいこと、また長期にわたってそれらのモジュールが利用できるかどうかは不明であることなどから、ここでは評価がある程度確立したモジュールだけをご紹介します。) Pythonのモジュールはそれ自体だけがPythonで書かれたモジュールと、C/C++などのコンパイル言語を使って書かれたモジュールが存在します。 後者のモジュールは、pythonのプログラムで実行速度が特に問題になるような場合に、実行速度を改善するために使われることがあります。 ``Cython``, ``f2py``, ``numba`` などのツールを使うことで、pythonモジュールを高速化する手法も存在します。 OSなどが提供する C/C++などで開発されたライブラリをpythonから呼び出す方法も存在します(``ctypes``)。この手法は強力ではありますが、OS間の移植性が失われますし、最悪の場合システムのシャットダウンを引き起こす可能性すらあります。これらの手法は **最後の武器** と考えておくのが良いでしょう。 いろいろなPython処理系(実行系) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 多くの場合、python.orgが配布しているPython処理系(CPython)が使われますが、 目的に応じて `それ以外のPython処理系 `__ が有用である場合があります。 Pythonの処理系としては、次のようなものがよく知られています。 1. ``CPython``\ :  公式のPython処理系. C/C++による実装 2. ``Jython``: javaによる実装。 Java objectがpython objectに自動的にマップされます。同じ作者による、.Net向けの\ ``Iron Python``\ もあります。 3. ``micropython``: マイクロコントローラ向けの小型の実装 4. ``pypy``: RPython(制限されたpython,Pythonのサブセット)で作られたpython実装系。JIT(Just in Time)コンパイラを内蔵している。 処理系自体はRPythonからC/C++などに変換された後、処理系が作成される。 5. `Brython: `__ JavascriptによるPythonの実装。webページにPythonプログラムを埋め込んで、実行できる。 Pythonのインストール確認 ------------------------ Pythonプログラムを実行するためには、Pythonプログラムを実行するための処理系(アプリケーション)が必要です。 幸いなことには、お使いの計算機には既に\ ``python3``\ がインストールされているかもしれません。 確かめてみましょう コマンドラインツールで :: python3 --version あるいは :: python --version py --version のいずれかを実行してみましょう。 Linux/macOSなどのシステムでは前者2つのどちらか、Windowsの環境では最後のコマンド(``py --version``)が使えるかもしれません。 以下に実行例を示します。 .. code:: sh %%sh python --version # on most of Unixen including macOS #py --version # windows only .. parsed-literal:: Python 2.7.16 .. code:: bash %%bash python3 --version .. parsed-literal:: Python 3.8.2 .. code:: ipython3 import sys print (sys.version) .. parsed-literal:: 3.9.6 (v3.9.6:db3ff76da1, Jun 28 2021, 11:49:53) [Clang 6.0 (clang-600.0.57)] これらのコマンドを実行した結果が :: Python 3.9.6 であれば python3のバージョン ``3.9.6`` がインストールされています。(2021.7.21現在のpython3最新版は、3.9.6です。) 注) 実行例の欄にある\ ``%%bash``\ はjupyterlabでこの入力を\ ``bash``\ で実行することを指示する、directiveです。 pythonがインストールされていなかったら? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 不幸にして、 - これらのコマンドが全く動作しない、 - あるいはインストールされたpythonがまだpython2に止まっている と言った場合には、 `Python ダウンロードサイト `__ からご使用の環境にあったインストーラーをダウンロードして、python3をインストールしましょう。 最新情報を見逃すな ------------------ Python ドキュメント ~~~~~~~~~~~~~~~~~~~ 公式のPython3ドキュメント(日本語訳)は  `Pythonドキュメント サイト `__ から閲覧可能です。 チュートリアルも用意されています。最新版以外のドキュメントも選択して表示させることができます。 PyPI サイト ~~~~~~~~~~~ 問題を解決するのに必要なライブラリが見つからない時は、 `PyPI Site `__ を探してみましょう。  (``pip`` コマンドの\ ``search``\ サブコマンドはこの文書執筆時の状況では\ **使えない**\ 状態です。 PyPIホームページで検索しましょう。) The Hitchhiker’s Guide to Python! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Python ドキュメントには公式の チュートリアル も掲載されています。此他にも色々なPython関連の資料がInternetから入手可能です。 この文書とよく似た名前の、\ `The Hitchhiker’s Guide to Python! `__\ は分かりやすいonline の Python入門書です。 `github `__ で最新版が提供されています。 `日本語版 `__\ もありますが、残念なことに最新版への追随が遅れている様です。 この文書を書き始めた後に、このサイトを *再発見* しました。 以前にサイトを訪れたことはあったものの、すっかりその存在を 忘れていました。 とはいえ、どこかで影響を受けているかもしれません。 ``help`` 関数 ~~~~~~~~~~~~~ pythonインタプリタには\ ``help``\ 関数が用意されています。\ ``help``\ の引数には関数名、クラス名、モジュール名などを与えることができます。 関数を定義する際に\ ``help``\ のための文字列も定義しておくことができます。 .. code:: ipython3 def foo(arg:int): """ docstring と呼ばれる関数定義のこの部分が ヘルプメッセージとして使われます。 """ return arg+2 help(foo) foo(100) .. parsed-literal:: Help on function foo in module __main__: foo(arg: int) docstring と呼ばれる関数定義のこの部分が ヘルプメッセージとして使われます。 .. parsed-literal:: 102 ライブラリ/モジュールの入手方法 -------------------------------- pythonの強みの一つは公開されている豊富なモジュール(ライブラリ)です。 あなたの問題を解決するのに役立つモジュールをまず探してみましょう。 `PyPI:The Python Package Index `__ はPytonのライブラリを探し始めるのに一番役に立つでしょう。 もちろん、\ ``Google Seach`` も頼りになるツールです。 pip/PyPI ~~~~~~~~ -------------- PIP : PyPI = yum(dnf) : RedHat/CentOS repository = apt : Ubuntu -------------- pipとPyPIの関係は yum/dnf と RedHat/CentOSなどのリポジトリとのに関係に似ています。 `PyPIサイト `__\ に登録されたさまざまなPythonのライブラリをpipコマンドを使って手元の環境にインストールすることができます。 pip の動作確認 ^^^^^^^^^^^^^^ pipはPython 3.4以降には、標準で付属しています。 pipが見つからなければ、python3のバージョンを3.4以上に更新した方が良いでしょう。 ``pip``\ がインストールされているかどうかを確認するために、コマンドラインで、 :: python3 -m pip --version を実行してみましょう。 :: pip 21.0.1 from /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pip (python 3.9) などと端末に出力されれば、\ ``pip``\ はインストール済みです。 .. code:: bash %%bash python3 -m pip --version .. parsed-literal:: pip 21.1.3 from /Users/noboru/Library/Python/3.8/lib/python/site-packages/pip (python 3.8) ``python3 -m pip `` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 以前は、コマンド\ ``pip3``\ が使われていましたが、次の例の様にこの形式は将来的に使えなくなります。\ ``python3 -m pip``\ の形式を使いましょう。 .. code:: bash %%bash pip3 --version .. parsed-literal:: pip 21.1.3 from /Users/noboru/Library/Python/3.8/lib/python/site-packages/pip (python 3.8) .. parsed-literal:: WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip. Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue. To avoid this problem you can invoke Python with '-m pip' instead of running pip directly. ``pyhton3 -m ``\ はpythonモジュールをメインプログラム(スクリプト)として実行することを指示します。 pipのインストール ^^^^^^^^^^^^^^^^^ 不幸にして\ ``pip``\ がインストールされていない場合は、 上に述べたようにpython3.4以降のpython3をインストールすることを検討しましょう。 どうしてもpython3.4以降のpython3をインストールできない場合には、 :: https://bootstrap.pypa.io/get-pip.py から\ ``get-pip.py``\ プログラムをダウンロードした上、 :: python3 get-pip.py あるいはwindowsでは、 :: py get-pip.py を実行します。 ``pip``\ のインストールの詳細は `pipのインストール `__ に詳しく紹介されています。 ``pip`` 本体の更新 ^^^^^^^^^^^^^^^^^^ ``pip``\ はpython3の標準配布の中に含まれていますが、python3本体の更新とは独立にバージョンアップされます。 必要に応じて :: python3 -m pip install -U pip を実行して、インストールされている\ ``pip``\ のバージョンを更新しておきましょう。 ``pip``\ の使い方 (\ ``-h/--help``) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :: python3 -m pip --help サブコマンドの詳細は、サブコマンド(以下の例では\ ``install``)の後に\ ``-h``\ または\ ``--help``\ オプションを指定します。 :: python3 -m pip install --help モジュールのインストール (``install`` サブコマンド) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :: python3 -m pip install ``search``\ サブコマンドは現状使えないので、\ ``PyPI``\ のweb ページでモジュールを検索しましょう。 モジュールの更新 (``-U/--upgrade``) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :: python3 -m pip install -U ユーザースペースへのインストール (``--user`` オプション) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :: python3 -m pip install --user M1-macでの注意点 ^^^^^^^^^^^^^^^^ -------------- x86-64向けしかないバイナリライブラリを含むモジュール(例えば\ ``matplotlib``)を使う際には 、 :: arch -x86_64 python3 を使う必要があります。 -------------- M1-macと呼ばれるarmベースのCPUを持つmacitoshでは、バイナリファイルとして arm64向け、x86_64向け、それらふたつのバイナリを一つのファイルとしてもつ fatバイナリの三つの形式があります。 残念ながらこのノートの執筆時点(2021/7/2現在)では、pipを経由してmacosにインストール可能なパッケージでありながら、x86_64向けのバイナリファイルだけが提供されているものがあります。 例えば、よく使われる matplotlib がその一つです。このような場合、pipでパッケージをinstallするばあいに、 ``arch`` コマンドを用いて、 :: arch -x86_64 python3 -m pip install -U matplotlib などとして、インストールすることができます。パッケージがx86_64向けのバイナリしか持っていませんので、利用する場合にも、 :: arch -x86_64 python3 などとして、python3本体もx86_64バイナリを使って起動することが必要です。 いずれM1 mac向けの配布パッケージがバイナリを含む場合には、Fat binary 形式が配布されるようになると思われますが、それまで、少しの間このトリックが必要になります。 (Python.orgで配布されているmacosx向けのpython3本体の配布も実験的にFatbinaryのInstallerが提供されています。あと少しの我慢でしょう。) :: Note: matplotlib本体ではなく、その中に含まれるscipyモジュールが問題となります。scipyをソースコードからarm64向け(あるいはFatbinary向けに)にコンパイルするなどの方法でインストールすれば、 archコマンド無しでも利用可能になります。(吉本さん、情報提供有難うございました。) #### macosでPythonでSSLを使う note: macos上のpythonプログラムでSSLを使う際には次のおまじないが必要です。 .. code:: ipython3 import os, certifi os.environ["SSL_CERT_FILE"]=certifi.where() conda/anaconda ~~~~~~~~~~~~~~ ``conda``\ はデータサイエンス分野でよく使われる パッケージ配布用プログラムです。この\ ``conda``\ をベースにデータサイエンスでよく使われさまざまなパッケージを管理/配布しているシステムが\ ``anaconda``\ と呼ばれています。  ``anaconda``\ ではExcelの表やRDBのテーブルと親和性のある\ ``dataframe``\ というデータ構造を使います。 この\ ``dataframe``\ は\ ``pandas``\ モジュールをインポートすることで、\ ``conda``/``anaconda``\ と離れて利用することも可能です。 尤も、これは順序が逆でデータ解析のPythonモジュールをまとめたパッケージを,蛇のアナコンダに因んで、\ ``anaconda``\ と名づけたと思われます。その\ ``anaconda``\ のパッケージプログラムを\ ``conda``\ と名づけたということと類推します。 それではなぜアナコンダなのかといえば、Python自体のアイコンに蛇が使われるように、python=大蛇ということで、大蛇の一種であるアナコンダにかけたということでしょう。 もっともプログラム言語のPythonの名前はBBCで放送された コメディ番組”Monty Python’s Flying Circus“から採ったと作者Guido van Rossumが述べています。(Foreward for”Programming Python",Mark Lutz, 1996, O’Reilly & Associates, Inc. )  [fn_python][] [fn_python]: 関係ないですが、 Wikipedia(日本語版)のPythonの解説に、 `KEKB control home page `__ が脚注で引用されている(リンク切れ)ことに気が付きました。(2021.4.21) その他のパッケージ配布システム ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Linuxであれば、\ ``dnf``\ (``yum``)や\ ``apt``\ といったパッケージ配布プログラムでpython処理系や様々なモジュールをインストール/更新 管理することができます。 これらの配布パッケージに含まれるPythonやそのライブラリのバージョンは、上記の\ ``pip``\ や\ ``conda``\ のリポジトリに比べやや古いことがあります。 一方で、利用中のシステムとの互換性が確認されているなど、運用上の安定性には優れています。 macosではhomebrew や Fink, mac ports もよく使われるパッケージ配布システムです。 これらのパッケージ配布システムを複数同時に使うと、ライブラリバージョンの衝突などで動作不良になることがあります。注意してお使いください。 開発環境: --------- Pythonプログラムは様々な方法で開発することができます。 簡単なテキストエディタから、プログラムの作成から、保存/管理/テスト/リリースまでの全てのステップを 助けてくれる統合プログラミング環境(IDE:Integrated Development Environment)まで 多数の選択肢が存在します。 ここでは、現在Pythonプログラム開発環境としてよく知られている Jupyter(IPython, Jupyter Lab)を紹介します。 IPython/Jupyter/Jupyter lab ~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. figure:: _images/jupyter_lab_screen.png :alt: Jupyterlab screen Images Jupyterlab screen Images -------------- Notebook形式で入力と出力(結果)を保存しておくことができる。 -------------- Jupyterは MathematicaのNotebookに似た、ドキュメントとプログラム(断片)およびその実行結果が 一つのファイルにまとめられたNotebook環境をプログラム開発のために提供します。 IPythonはJupyterの前身のプログラムであり、Ascii端末をその入出力装置として使うことを想定していました。 このIPythonのNotebookをWebブラウザの画面から、編集/実行できるように拡張したのが Jupyterということになります。 さらに、このweb ブラウザ上の編集/実行環境を進化させ、次の世代のJupyterになると考えられているのが、Jupyter-labです。 jupyterlabのドキュメントは https://jupyterlab.readthedocs.io/en/stable/ を探してみましょう。 Jupyter/ Jupyter-labは ``pip``\ を使って簡単にインストールすることができます。 pip install jupyter pip install jupyterlab IPython/Jupyter/Jupyter-lab はpython言語\ *専用*\ の開発支援プログラムというわけではなく、 C/C++など様々プログラミング言語の開発支援パッケージが存在しています。 例えば、Open Sourceの数式処理システムである SageMathは、Jupyter を標準の開発環境としています。 Jupyterで利用可能なプログラム言語(Kernel)は `List of Kernels `__ のリストをご覧ください。 Python3をサポートする エディター ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ python3プログラムの開発にはどのようなテキストエディターでも使うことができます。 しかしながら、 **emacs/ atom /VSC(Visual Stduio Code)** など多くのプログラム 開発用エディタは ``python`` プログラム開発をサポートする機能を有しています。 使い慣れたエディタに ``python`` サポート機能を追加することで、開発の効率も上がるでしょう(多分)。 IDLE: Python 標準配布に含まれるIDE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. figure:: _images/IDLE_screen.png :alt: Image Image IDLEは多くの(もし全てでなければ)Python処理系の配布パッケージに含まれている、Python専用の プログラム開発環境です。 IDLE自体もPythonを使って制作されています。 IDEとして期待される 基本的な機能はサポートされています。 Python処理系がインストールされている環境であれば、ほとんどの場合利用可能という意味では、 入門の説明にちょうど良いのですが、それほど使われているわけではなさそうです。 PythonとTkでここまでできるというサンプルではあります。 emacs ~~~~~ EMACS editor .. figure:: _images/emacs-edit-screen.png :alt: Image Image GNUが配布しているテキストエディタ。著者の愛用です。 python-mode/cython-mode などを実現する 拡張モジュール(Emacs Lispのプログラム)が配布されており、 これらのモジュールを導入することで、pythonプログラムの開発が効率化されます。 atom /VSC(Visual Stduio Code) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ATOM editor .. figure:: _images/ATOM-edit-pane.png :alt: Image Image atom/VSCはいずれもJavascriptで開発された、近年流行りのエディターです。 いずれも無料で入手できますが、atomはopen source, VSCはマイクロソフトが開発提供しています。 VSCにはPythonをサポートする機能拡張がマイクロソフトから提供されていますので、 これをインストールして利用します。 仮想環境:venv -------------- -------------- モジュールのコンフリクトを避けるには, 仮想環境を使いましょう。 -------------- 色々なプログラムを同時に開発していると、インストールしているPythonモジュールのコンフリクトが起きてしまうことが あります。また、新しいPythonモジュールをテストしたいけれど、システムにはまだインストールしたくないということもあります。 このような場合に役に立つのが\ ``venv``\ などのPython実行用仮想環境作成ツールです。 ``venv``\ はpython3の標準配布に含まれているので、これから始めるのが良いでしょう。 virtualenvはpython2の時代によく使われていたツールです。venvはvirtualenvの機能のサブセットをpython3の 標準機能として取り込んだものとされています。 フルセットの ```virtualenv`` `__\ や ```pyenv`` `__ などの機能強化されたツールも3rdパーティから登場しています。   venvの使い方 ~~~~~~~~~~~~ venv環境の作成 ^^^^^^^^^^^^^^ pythonの独立した環境を作るために、venvを使ってみましょう。 まずこの環境をセットアップするディレクトリ(ここでは、/path/to/new/virtual/environment)とします。 :: python3 -m venv /path/to/new/virtual/environment を実行することで、/path/to/new/virtual/environmentの中に、独立した環境を 設定するために必要なファイルを作成します。 :: % ls /path/to/new/virtual/environment bin include lib pyvenv.cfg pytenv.cfgにはvenvの設定が書き込まれています。 :: % cat pyvenv.cfg home = /path/to/PythonBinary/3.9/bin include-system-site-packages = false version = 3.9.6 venv環境に入る。 ^^^^^^^^^^^^^^^^ -------------- 使用するShellに応じた方法で\ ``venv``\ 環境を\ ``activate``\ します。 -------------- 作成したvenv環境をactivateすることで、この独立したpython環境の利用が始まります。 activateはvenvの必要とする環境変数等を操作します。 したがって、お使いになるSHELLに合わせたactivateファイルを利用することが必要です。 bash/shellでは、 :: source /bin/activate あるいは :: . /bin/activate csh/tcshでは、 :: source /bin/activate.csh fishでは、 :: source /bin/activate.fish PowerShell Core :: $ /bin/Activate.ps1 Windowsのcmd.exeでは、 :: C:\> \Scripts\activate.bat PowerShellでは :: PS C:\> \Scripts\Activate.ps1 をそれぞれ実行します。 ```` は作成したvenv環境のPath名(作成例では、 /path/to/new/virtual/environment )を指定します。 実行すると、 :: bash-3.2$ source /path/to/new/virtual/environment/bin/activate (environment) bash-3.2$ の様にシェル プロンプトに利用しているvenv環境の名前が追加されます。 この状態で起動されるpythonの本体は、 :: (environment) bash-3.2$ which python3 /path/to/new/virtual/environment/bin/python3 となっています。 このvenv環境で、pip3や“python3 -m pip”を使って、pythonモジュールをインストールすると、 ``/lib/python3.x/site-packages`` に必要なファイルが追加されます。この仕組みによって、通常の環境とvenv環境を切り分けている訳です。 venv環境を抜ける。 ^^^^^^^^^^^^^^^^^^ この独立した環境を抜け出して、元の状態に戻るには、deactivateコマンドを使います。 :: (environment) bash-3.2$ deactivate bash-3.2$ バージョン管理 -------------- 今時のプログラム開発ではソースコードをバージョン管理することが必須でしょう。 git(``git``)/ mercurial(``hg``)などが現場での主要なバージョン管理ソフトウェアでしょう。 これらのソフトを環境に応じてお使いください。 mercurial(``hg``) ~~~~~~~~~~~~~~~~~ mercurialはpythonで作られているバージョン管理ツールで、 :: python3 -m pip install mercurial で簡単にインストール可能です。 多くの統合開発環境でもこれらのツールはサポートされています。  その他 ------ cython ~~~~~~ -------------- もっと速く! : C/C++のライブラリとPythonの結合 -------------- プログラムの実行時間の99%はプログラムの1%の実行であると言われることがあるように、 プログラムのごく一部を高速化することで、飛躍的に性能が向上します。 python処理系はインタプリタ形のシステムなので、実行速度はC++/Fortranなどと比べれば 遅くなります。 cythonは python言語のサブセットに独自の拡張を加えたcython言語で書かれたプログラムを コンパイルし、pythonから呼び出せるようにしてくれます。cython言語はpython言語と一定の互換性がありますので、 python言語で書かれたプログラム(関数)をコンパイルすることも可能です。cythonは既存の別言語(C++とか)で書かれたライブラリ をpythonから利用する場合にも使われます。 ``numba``\ といった同様の機能をもったツールもあらわれています。 numpy/f2py/scipy ~~~~~~~~~~~~~~~~ ``numpy``\ はpythonで高速な数値計算を行う場合の実質的な基盤となっている、numpy.ndarrayデータ構造などを 提供しています。\ ``scipy``\ は科学計算向けのライブラリです。 ``numba`` ~~~~~~~~~ ``numba``\ はpython(のサブセット)で記述されたプログラムを、実行時に機械語に変換して実行するJIT(Just In Time)型コンパイル ツールです。一旦機械語に翻訳された結果は再利用されますので、大量のデータを処理する際には、翻訳(コンパイル)の 時間を考慮しても、大きな実行速度の改善が見込まれます。 Pythonのチューニング: cProfile/profile/timeit ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ py2app/py2exe ~~~~~~~~~~~~~ pythonで作成したプログラムを単独のアプリケーションとして配布可能な形にまとめあげてくれるツールです。 作成したpythonプログラムを必要なpythonモジュールおよびpythonの処理系をパッケージ化してくれます。 python2とpython3の違いについて ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Python2からPython3へのバージョンアップでは、 - printが文から関数になった。 - Tkinterの名前がtkinterに変更された。 - 文字型データ(str)がunicodeになった。 などPython言語の文法の変更、モジュール名の変更/統合など広範な変更があります。幸いなことに、\ ``2to3``\ などのツールを使うことで、python2向けのスクリプトをpython3向けのスクリプトに書き換えることや、python2/python3両用のスクリプトの書き換えることなどをサポートしてくれるツールが存在します。詳細は、拙著のメモ `Python2からPython3へ移行するときに知っておくといいかもしれない幾つかの事 `__ がご参考になれば幸いです。 pythonの哲学(禅) ~~~~~~~~~~~~~~~~ ``import this`` を実行してみましょう。 .. code:: ipython3 import this .. parsed-literal:: The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. Sparse is better than dense. Readability counts. Special cases aren't special enough to break the rules. Although practicality beats purity. Errors should never pass silently. Unless explicitly silenced. In the face of ambiguity, refuse the temptation to guess. There should be one-- and preferably only one --obvious way to do it. Although that way may not be obvious at first unless you're Dutch. Now is better than never. Although never is often better than *right* now. If the implementation is hard to explain, it's a bad idea. If the implementation is easy to explain, it may be a good idea. Namespaces are one honking great idea -- let's do more of those! “PEP 20 – The Zen of Python”は、 Pythonの先駆者の一人であるTim Perters氏が拝察したPythonの産みの親Guido van Rossum氏のPython設計の指針を簡潔に表現したものです。   筆者の個人的見解ですが、これは”Zen(禅)”であって、 教条主義的に守るためのルールというわけではなく、迷った時の指針として使われるべきものと考えます。 (”禅宗は臨機応変”だそうです。) “PEP 20”には、”Long time Pythoneer Tim Peters succinctly channels the BDFL’s guiding principles for Python’s design into 20 aphorisms, only 19 of which have been written down.”となっていて、あと一つ書き下されていない指針が あることになります。 未完のまま残しておくのは、”Zen"らしいところですね。